/**********************************************************************************************/
/* FBL_Location_FSRef.h		                                                      			  */
/*                                                                       					  */
/* Copyright Paradigma, 1993-2006															  */
/* All Rights Reserved                                                   					  */
/**********************************************************************************************/

#ifndef __FBL_Location_FSRef_h 
	#define __FBL_Location_FSRef_h
#pragma once

// FBL: 
#include <VShared/FBL/publ/Location/FBL_Location.h>

// FINAL: 
#include <VShared/FBL/publ/Headers/FBL_pre_header.h>


/**********************************************************************************************/
#if FBL_MAC


/**********************************************************************************************/
FBL_Begin_Namespace


/**********************************************************************************************/
SMART_CLASS(Location_Disk_FSRef);


/**********************************************************************************************/
class FBL_SHARED_EXP_CLASS Location_Disk_FSRef : public Location
{
	public://///////////////////////////////////////////////////////////////////////////////////
 
		//------------------
		// Construction:
		
							/** Expect Full path or just FileName. */
							Location_Disk_FSRef( 
								const String* inFullPath = NULL );

							// inName can be NULL.
	 						Location_Disk_FSRef( 
	 							HFSUniStr255* 	inName,
	 							const FSRef* 	inObjectRef );

	 						Location_Disk_FSRef( 
	 							const FSRef* 	inParentRef,
	 							HFSUniStr255& 	inName );

							Location_Disk_FSRef( 
								const Location_Disk_FSRef& inOther );

virtual						~Location_Disk_FSRef( void );
					
		Location_Disk_FSRef& operator=( const Location_Disk_FSRef& inOther );


	public://///////////////////////////////////////////////////////////////////////////////////

// I_Location API:

virtual	const String&		get_Path( void ) const throw();
virtual	void				put_Path( const String& inFullPath ) throw();
virtual	void				put_Path( const UChar* inFullPath ) throw();

virtual	bool				get_IsUndefined( void ) const throw();

virtual I_Location_Ptr		get_ChildLocation( const char* inName ) const;
virtual I_Location_Ptr		get_ChildLocation( const UChar* inName ) const;
virtual I_Location_Ptr		get_ChildLocation( const String& inName ) const;

virtual I_Location_Ptr		get_ParentDirectory( void ) const;

virtual I_Location_Ptr		Clone( void ) const throw()
								{ return new Location_Disk_FSRef(*this); }


	public://///////////////////////////////////////////////////////////////////////////////////

// I_Disk_Location API:

		//------------------
		// Properties:

virtual	const String&		get_FileName( void ) const throw();
	  		
virtual	bool				get_Exists( void ) const throw();
virtual	bool				get_IsDirectory( void ) const throw();


	public://///////////////////////////////////////////////////////////////////////////////////

// For MacOS FSSpec:

virtual	const FSSpec*		get_FSSpec( void ) const;  
virtual	void				put_FSSpec( const FSSpec* inSpec );


	public://///////////////////////////////////////////////////////////////////////////////////

// For MacOS FSSRef:

virtual	const FSRef*		get_ParentFSRef( void ) const;  

virtual	OSStatus			get_ObjectFSRef( FSRef* outRef ) const;  
virtual	void				put_ObjectFSRef( const FSRef* inRef );


	private:////////////////////////////////////////////////////////////////////////////////////
 
mutable	bool 				mParentRefExists;
mutable	bool 				mObjectRefExists;

mutable	FSRef				mParentFSRef;
mutable	FSRef				mObjectFSRef;

		HFSUniStr255		mName;
}; 


/**********************************************************************************************/
FBL_End_Namespace

#endif // FBL_MAC

#endif // __FBL_Location_FSRef_h
